package model.simulationmodel.logicelements;

import model.editormodel.Input;
import model.editormodel.LogicEditorElement;
import model.editormodel.Output;
import model.simulationmodel.LogicValue;
import model.simulationmodel.SimulationModel;

/**
 * <b>Erbt:</b> <code>LogicSimulationElement</code> <br>
 * <b>Funktion:</b> Anlegen eines logischen Wertes<br>
 * <b>Logik:</b> i = eingestellter Wert, o = Ausgang <br>
 * i || o <br>
 * ----<br>
 * 1 || 1 <br>
 * 0 || 0 <br>
 * <br>
 * Repraesentiert einen Schalter. Dieser gibt den vom Benutzer eingestellten
 * Wert direkt an den Ausgang weiter.
 * 
 * @author Team Locsi
 * 
 */
public class LogicSwitch extends LogicSimulationElement {

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>LogicSwitch</code>-Objekt.
	 * 
	 * @param sModel
	 *            <code>SimulationModel</code> - Referenz auf das
	 *            <code>SimulationModel</code>
	 * @param logicEditorElement
	 *            <code>LogicEditorElement</code> - Referenz auf das zugehoerige
	 *            <code>LogicEditorElement</code>
	 */
	public LogicSwitch(SimulationModel sModel,
			LogicEditorElement logicEditorElement) {
		super(sModel, logicEditorElement);
	}

	@Override
	public void calcLogicValue() {
		//setzt den Ausgang mit dem Wert des Eingangs
		this.setOutputValue(Output.STD_O, logicInputValueMap.get(Input.STD_A));
	}

	/**
	 * Diese Methode kehrt den eingestellten Wert um
	 * 
	 * @param propagate
	 *            gibt an, ob der logische Wert weitergeleitet werden soll
	 */
	public void changeValue() {
		// Wert am Eingang holen
		LogicValue a = logicInputValueMap.get(Input.STD_A);
		// falls L0 eingestellt war wird der eingestellte Wert auf L1 gesetzt
		// falls L1 eingestellt war wird der eingestellte Wert auf L0 gesetzt
		if (a == LogicValue.L0) {
			logicInputValueMap.put(Input.STD_A, LogicValue.L1);
		} else if (a == LogicValue.L1) {
			logicInputValueMap.put(Input.STD_A, LogicValue.L0);
		}
	}
}